#include "ChatPrompt.h"
#include <QCoreApplication>
#include <QDebug>
#include <QFile>
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>

ChatPrompt* ChatPrompt::instance = nullptr;

ChatPrompt* ChatPrompt::getInstance()
{
    if(instance == nullptr) {
        instance = new ChatPrompt();
    }
    return instance;
}

ChatPrompt::ChatPrompt()
{
    qDebug() << "初始化聊天提示管理器";
    initDefaultPrompt();
    
    QString defaultPath = getPromptPath();
    if(!load(defaultPath)) {
        qDebug() << "未能从默认路径加载配置，使用默认设置";
    }
}

ChatPrompt::~ChatPrompt()
{
}

QString ChatPrompt::getPromptPath()
{
    return QCoreApplication::applicationDirPath() + "/chat_prompt.json";
}

void ChatPrompt::initDefaultPrompt()
{
    m_promptInfo.prompt = R"(
- Role: AI助手
- Background: 你是一个智能AI助手，能够回答用户的各种问题。
- Profile: 你拥有广泛的知识，可以用简单易懂的方式解释复杂的概念。
- Skills: 
  * 准确理解用户问题
  * 提供清晰的解答
  * 保持对话的连贯性
  * 适时提供建议和补充
- Goals: 
  * 帮助用户解决问题
  * 提供有价值的信息
  * 保持友好和专业的态度
- Constraints: 
  * 不提供虚假信息
  * 不讨论敏感话题
  * 承认知识的局限性
- OutputFormat: 使用清晰的语言直接回答问题
)";
    m_promptInfo.chatPrefix = "用户问题：";
    m_promptInfo.chatSuffix = "\n请用简明扼要的方式回答上述问题。";
}

bool ChatPrompt::save(const QString &filePath)
{
    QJsonObject jsonObject;
    
    jsonObject["prompt"] = m_promptInfo.prompt;
    jsonObject["chatPrefix"] = m_promptInfo.chatPrefix;
    jsonObject["chatSuffix"] = m_promptInfo.chatSuffix;
    
    QJsonArray userPrompts;
    for(const QString &prompt : m_promptInfo.userPromptList) {
        userPrompts.append(prompt);
    }
    jsonObject["userPrompts"] = userPrompts;
    
    QJsonArray assistantPrompts;
    for(const QString &prompt : m_promptInfo.assistantPromptList) {
        assistantPrompts.append(prompt);
    }
    jsonObject["assistantPrompts"] = assistantPrompts;
    
    QFile file(filePath);
    if(!file.open(QIODevice::WriteOnly)) {
        qDebug() << "无法创建JSON文件:" << filePath;
        return false;
    }
    
    QJsonDocument jsonDoc(jsonObject);
    file.write(jsonDoc.toJson());
    file.close();
    
    qDebug() << "成功保存提示信息到文件:" << filePath;
    return true;
}

bool ChatPrompt::load(const QString &filePath)
{
    QFile file(filePath);
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug() << "无法打开JSON文件:" << filePath;
        return false;
    }
    
    QByteArray jsonData = file.readAll();
    file.close();
    
    QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);
    if(jsonDoc.isNull()) {
        qDebug() << "JSON文件格式无效:" << filePath;
        return false;
    }
    
    QJsonObject jsonObject = jsonDoc.object();
    
    if(jsonObject.contains("prompt")) {
        m_promptInfo.prompt = jsonObject["prompt"].toString();
    }
    if(jsonObject.contains("chatPrefix")) {
        m_promptInfo.chatPrefix = jsonObject["chatPrefix"].toString();
    }
    if(jsonObject.contains("chatSuffix")) {
        m_promptInfo.chatSuffix = jsonObject["chatSuffix"].toString();
    }
    
    m_promptInfo.userPromptList.clear();
    if(jsonObject.contains("userPrompts") && jsonObject["userPrompts"].isArray()) {
        QJsonArray userPrompts = jsonObject["userPrompts"].toArray();
        for(const QJsonValue &value : userPrompts) {
            m_promptInfo.userPromptList.append(value.toString());
        }
    }
    
    m_promptInfo.assistantPromptList.clear();
    if(jsonObject.contains("assistantPrompts") && jsonObject["assistantPrompts"].isArray()) {
        QJsonArray assistantPrompts = jsonObject["assistantPrompts"].toArray();
        for(const QJsonValue &value : assistantPrompts) {
            m_promptInfo.assistantPromptList.append(value.toString());
        }
    }
    
    qDebug() << "成功从文件加载提示信息:" << filePath;
    return true;
}

void ChatPrompt::changePrompt(const QString &prompt, const QString &chatPrefix,
                            const QString &chatSuffix, const QVector<QString> &userPromptList,
                            const QVector<QString> &assistantPromptList)
{
    qDebug() << "修改提示信息";
    
    m_promptInfo.prompt = prompt;
    m_promptInfo.chatPrefix = chatPrefix;
    m_promptInfo.chatSuffix = chatSuffix;
    m_promptInfo.userPromptList = userPromptList;
    m_promptInfo.assistantPromptList = assistantPromptList;
    
    qDebug() << "提示信息已更新";
}

void ChatPrompt::resetToDefault()
{
    qDebug() << "重置为默认提示信息";
    initDefaultPrompt();
    qDebug() << "已恢复默认提示信息";
} 